Skip to content

[功能] 播放音乐

一、使用 <audio> 组件

在微信小程序中,你可以使用 <audio> 组件来添加和控制音频播放。<audio> 组件提供了丰富的属性和事件来管理音频的播放、暂停、音量控制等。以下是如何在微信小程序中添加音频并进行基本控制的步骤。

1. 在 WXML 文件中添加 <audio> 组件

首先,在你的页面的 WXML 文件中添加 <audio> 组件,并设置相关的属性。

xml
<!-- pages/index/index.wxml -->
<view class="container">
  <button bindtap="playAudio">播放</button>
  <button bindtap="pauseAudio">暂停</button>
  <button bindtap="stopAudio">停止</button>

  <audio
    id="myAudio"
    src="https://example.com/your-audio-file.mp3"
    loop="{{false}}"
    controls="{{true}}"
    bindplay="onPlay"
    bindpause="onPause"
    bindended="onEnded"
  ></audio>
</view>

2. 在 WXSS 文件中添加样式(可选)

如果你需要对按钮或其他元素进行样式设置,可以在 WXSS 文件中添加相应的样式。

css
/* pages/index/index.wxss */
.container {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 20px;
}

button {
  margin: 10px;
}

3. 在 JS 文件中编写逻辑

在页面的 JS 文件中编写处理音频播放、暂停和停止的逻辑。

javascript
// pages/index/index.js
Page({
  data: {
    // 可以在这里定义一些数据
  },

  // 播放音频
  playAudio: function () {
    const audioContext = wx.createInnerAudioContext();
    audioContext.src = "https://example.com/your-audio-file.mp3";
    audioContext.play();
  },

  // 暂停音频
  pauseAudio: function () {
    const audioContext = wx.createInnerAudioContext();
    audioContext.pause();
  },

  // 停止音频
  stopAudio: function () {
    const audioContext = wx.createInnerAudioContext();
    audioContext.stop();
  },

  // 音频开始播放时触发
  onPlay: function () {
    console.log("音频开始播放");
  },

  // 音频暂停时触发
  onPause: function () {
    console.log("音频暂停");
  },

  // 音频播放结束时触发
  onEnded: function () {
    console.log("音频播放结束");
  },
});

4. 使用 wx.createInnerAudioContext() 进行更复杂的控制

如果你需要更复杂的音频控制,例如动态改变音量、监听更多事件等,可以使用 wx.createInnerAudioContext() 来创建一个音频上下文对象。

javascript
// pages/index/index.js
Page({
  data: {
    audioContext: null,
  },

  onLoad: function () {
    this.data.audioContext = wx.createInnerAudioContext();
    this.data.audioContext.src = "https://example.com/your-audio-file.mp3";
  },

  // 播放音频
  playAudio: function () {
    this.data.audioContext.play();
  },

  // 暂停音频
  pauseAudio: function () {
    this.data.audioContext.pause();
  },

  // 停止音频
  stopAudio: function () {
    this.data.audioContext.stop();
  },

  // 设置音量
  setVolume: function (volume) {
    this.data.audioContext.volume = volume; // 0 到 1 之间的值
  },

  // 获取当前播放位置
  getCurrentPosition: function () {
    console.log("当前播放位置:", this.data.audioContext.currentTime);
  },

  // 音频开始播放时触发
  onPlay: function () {
    console.log("音频开始播放");
  },

  // 音频暂停时触发
  onPause: function () {
    console.log("音频暂停");
  },

  // 音频播放结束时触发
  onEnded: function () {
    console.log("音频播放结束");
  },
});

5. 使用 controls 属性显示内置控件

如果你希望在页面上直接显示音频播放控件,可以将 controls 属性设置为 true

xml
<audio
  id="myAudio"
  src="https://example.com/your-audio-file.mp3"
  loop="{{false}}"
  controls="{{true}}"
></audio>

这样,用户可以直接通过界面上的控件来控制音频的播放、暂停和音量调节。

总结

通过上述步骤,你可以在微信小程序中添加并控制音频播放。<audio> 组件提供了多种属性和事件,可以帮助你实现各种音频播放的需求。如果你有更具体的场景或需求,请告诉我,我可以提供更加详细的帮助。

二、使用 wx.createInnerAudioContext()

wx.createInnerAudioContext() 是微信小程序提供的一个 API,用于创建和返回一个内部音频上下文 InnerAudioContext 对象。这个对象可以用来控制音频的播放、暂停、停止等操作,并且可以监听音频的各种事件。以下是使用 wx.createInnerAudioContext() 的详细说明和示例。

基本用法

  1. 创建音频上下文: 使用 wx.createInnerAudioContext() 创建一个 InnerAudioContext 对象。

  2. 设置音频源: 通过 src 属性设置音频文件的 URL。

  3. 控制音频播放: 使用 play()pause()stop() 等方法来控制音频的播放状态。

  4. 监听音频事件: 通过 onPlayonPauseonStoponEnded 等事件来监听音频的状态变化。

示例代码

WXML 文件

xml
<!-- pages/index/index.wxml -->
<view class="container">
  <button bindtap="playAudio">播放</button>
  <button bindtap="pauseAudio">暂停</button>
  <button bindtap="stopAudio">停止</button>
  <button bindtap="setVolume">设置音量为0.5</button>
</view>

WXSS 文件

css
/* pages/index/index.wxss */
.container {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 20px;
}

button {
  margin: 10px;
}

JS 文件

javascript
// pages/index/index.js
Page({
  data: {
    audioContext: null,
  },

  onLoad: function () {
    // 创建音频上下文
    this.data.audioContext = wx.createInnerAudioContext();
    this.data.audioContext.src = "https://example.com/your-audio-file.mp3";

    // 监听音频事件
    this.data.audioContext.onPlay(() => {
      console.log("音频开始播放");
    });

    this.data.audioContext.onPause(() => {
      console.log("音频暂停");
    });

    this.data.audioContext.onStop(() => {
      console.log("音频停止");
    });

    this.data.audioContext.onEnded(() => {
      console.log("音频播放结束");
    });

    this.data.audioContext.onError((res) => {
      console.error("音频错误", res);
    });
  },

  // 播放音频
  playAudio: function () {
    this.data.audioContext.play();
  },

  // 暂停音频
  pauseAudio: function () {
    this.data.audioContext.pause();
  },

  // 停止音频
  stopAudio: function () {
    this.data.audioContext.stop();
  },

  // 设置音量
  setVolume: function () {
    this.data.audioContext.volume = 0.5; // 设置音量为0.5
  },
});

详细属性和方法

  • src:设置音频文件的 URL。
  • startTime:设置开始播放的位置(单位:秒)。
  • autoplay:是否自动播放,默认为 false
  • loop:是否循环播放,默认为 false
  • obeyMuteSwitch:是否遵循系统静音开关,默认为 true
  • volume:设置音量,范围在 0 到 1 之间,默认为 1。
  • duration:获取音频总时长(单位:秒)。
  • currentTime:获取或设置当前播放位置(单位:秒)。
  • paused:获取当前是否暂停。
  • buffered:获取已缓冲的数据范围。
  • seek:跳转到指定位置(单位:秒)。

事件

  • onCanplay:音频可播放时触发。
  • onPlay:音频开始播放时触发。
  • onPause:音频暂停时触发。
  • onStop:音频停止时触发。
  • onEnded:音频自然播放结束时触发。
  • onTimeUpdate:音频播放进度更新时触发。
  • onError:音频发生错误时触发。
  • onWaiting:音频由于需要缓冲下一帧而停止时触发。
  • onSeeking:音频开始跳转时触发。
  • onSeeked:音频完成跳转时触发。

注意事项

  1. 网络请求:确保音频文件的 URL 是有效的,并且可以通过网络访问。
  2. 权限:确保你的小程序有相应的网络请求权限。
  3. 性能:避免频繁创建和销毁 InnerAudioContext 对象,以提高性能。
  4. 用户体验:合理处理音频的播放、暂停和停止逻辑,提供良好的用户体验。

通过上述示例和说明,你应该能够更好地理解和使用 wx.createInnerAudioContext() 来控制音频播放。如果你有更具体的场景或需求,请告诉我,我可以提供更加详细的帮助。

三、区别

在微信小程序中,<audio> 组件和 wx.createInnerAudioContext() 都可以用来处理音频播放,但它们在使用方式、功能和适用场景上有一些区别。以下是两者的主要区别:

<audio> 组件

使用方式

  • 声明式:通过在 WXML 文件中直接声明 <audio> 组件来使用。
  • 内置控件:可以直接显示音频播放控件(如播放/暂停按钮、进度条等),用户可以直接通过界面上的控件来控制音频。

功能

  • 简单易用:适合简单的音频播放需求,提供了基本的播放、暂停、停止等功能。
  • 自动播放:可以通过设置 autoplay 属性实现自动播放。
  • 循环播放:可以通过设置 loop 属性实现循环播放。
  • 内置控件:通过 controls 属性显示或隐藏内置的播放控件。

事件

  • 支持 bindplaybindpausebindended 等事件,用于监听音频的状态变化。

示例

xml
<!-- pages/index/index.wxml -->
<audio
  id="myAudio"
  src="https://example.com/your-audio-file.mp3"
  loop="{{false}}"
  controls="{{true}}"
  bindplay="onPlay"
  bindpause="onPause"
  bindended="onEnded"
></audio>
javascript
// pages/index/index.js
Page({
  onPlay: function () {
    console.log("音频开始播放");
  },
  onPause: function () {
    console.log("音频暂停");
  },
  onEnded: function () {
    console.log("音频播放结束");
  },
});

wx.createInnerAudioContext()

使用方式

  • 编程式:通过 JavaScript 代码创建 InnerAudioContext 对象来使用。
  • 无内置控件:不提供内置的播放控件,需要开发者自行实现界面控件。

功能

  • 更灵活:提供了更多的控制方法和属性,适合复杂的音频播放需求。
  • 更多属性:支持 startTimedurationcurrentTimevolume 等属性。
  • 更多事件:支持 onCanplayonTimeUpdateonError 等更多事件。

事件

  • 支持 onPlayonPauseonStoponEndedonTimeUpdate 等事件,用于监听音频的状态变化。

示例

javascript
// pages/index/index.js
Page({
  data: {
    audioContext: null,
  },

  onLoad: function () {
    // 创建音频上下文
    this.data.audioContext = wx.createInnerAudioContext();
    this.data.audioContext.src = "https://example.com/your-audio-file.mp3";

    // 监听音频事件
    this.data.audioContext.onPlay(() => {
      console.log("音频开始播放");
    });

    this.data.audioContext.onPause(() => {
      console.log("音频暂停");
    });

    this.data.audioContext.onStop(() => {
      console.log("音频停止");
    });

    this.data.audioContext.onEnded(() => {
      console.log("音频播放结束");
    });

    this.data.audioContext.onError((res) => {
      console.error("音频错误", res);
    });
    this.data.audioContext.onCanplay(() => {
      const duration = this.data.audioContext.duration;
      console.log("音频总时长:", duration, "秒");
    });
    this.data.audioContext.onTimeUpdate(() => {
      const currentTime = this.data.audioContext.currentTime;
      const duration = this.data.audioContext.duration;
      const progressPercent = (currentTime / duration) * 100;
      console.log("当前播放进度:", currentTime, "秒");
    });
    this.data.audioContext.seek(seekTime).then(() => {
      console.log("跳转到指定时间成功:", seekTime, "秒");
    });
  },

  // 播放音频
  playAudio: function () {
    this.data.audioContext.play();
  },

  // 暂停音频
  pauseAudio: function () {
    this.data.audioContext.pause();
  },

  // 停止音频
  stopAudio: function () {
    this.data.audioContext.stop();
  },

  // 设置音量
  setVolume: function () {
    this.data.audioContext.volume = 0.5; // 设置音量为0.5
  },
});

主要区别总结

  1. 使用方式

    • <audio> 组件是声明式的,适合简单的音频播放需求。
    • wx.createInnerAudioContext() 是编程式的,适合复杂的音频播放需求。
  2. 控件显示

    • <audio> 组件可以直接显示内置的播放控件。
    • wx.createInnerAudioContext() 不提供内置控件,需要开发者自行实现。
  3. 功能和灵活性

    • <audio> 组件提供了基本的播放、暂停、停止等功能,适合简单的场景。
    • wx.createInnerAudioContext() 提供了更多的控制方法和属性,更适合复杂的音频播放需求。
  4. 事件

    • <audio> 组件支持基本的事件,如 bindplaybindpausebindended
    • wx.createInnerAudioContext() 支持更多的事件,如 onCanplayonTimeUpdateonError 等。

根据你的具体需求选择合适的方式。如果你只需要简单的音频播放功能,并且希望有内置的播放控件,可以选择 <audio> 组件。如果你需要更复杂的控制和更多的功能,建议使用 wx.createInnerAudioContext()

Released under the MIT License.